/*
 * Copyright (C) 2020 The LINN Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.juqimiao.linn.transfer.query.builders;

import com.juqimiao.linn.exception.ErrorI;
import com.juqimiao.linn.transfer.Response;
import com.juqimiao.linn.transfer.query.QueryResponse;

/**
 * 构建响应对象{@link com.juqimiao.linn.transfer.query.QueryResponse}的构造者类。
 *
 * @author  Collin Cai
 */
public class QueryResponseBuilder extends BaseResponseBuilder<QueryResponse> {

    private boolean isSuccessHandled = false;

    /**
     * 将响应对象设置为"成功"状态，并返回{@link DataBuilder},
     * 以便可以继续为响应对象设置数据。
     *
     * @param successfulMessage 可选，表示附加的成功信息。
     * @return 返回一个构建数据构造者的对象。
     */
    public DataBuilder success(String successfulMessage) {
        getResponse().makeSuccess(successfulMessage);
        return new DataBuilder();
    }

    /**
     * 对响应对象设置错误信息。
     *
     * @param errorCode    错误代号.
     * @param errorMessage 错误信息。
     * @return 一个QueryResponse对象。
     */
    public QueryResponse failure(String errorCode, String errorMessage) {
        Response response = getResponse();
        response.makeFailure(errorCode, errorMessage);
        return this.getResponse();
    }

    /**
     * 创建一个包含错误信息的响应对象。
     *
     * @param error 一个错误对象。
     * @return 一个响应对象。
     */
    public QueryResponse failure(ErrorI error) {
        Response response = getResponse();
        response.makeFailure(error.getErrorCode(), error.getErrorMessage());
        return this.getResponse();
    }

    /**
     * 表示一个填充数据到响应对象中的构造者类。
     */
    public class DataBuilder {

        /**
         * 填充虚拟中数据总数到响应对象中。
         *
         * @param data 填充的数据对象。
         * @param <D>  表示数据对象类型。
         * @return 一个填充总记录条数总数到响应对象中的构造者对象。
         */
        public <D> TotalBuilder of(D data) {
            QueryResponse response = getResponse();
            response.setData(data);
            QueryResponseBuilder.super.setResponse(response);
            return new TotalBuilder();
        }

        /**
         * 在响应构建过程最后阶段调用，从而得到一个响应对象。
         *
         * @return 一个响应对象。
         */
        public QueryResponse build() {
            return QueryResponseBuilder.super.build();
        }
    }

    /**
     * 表示填充总记录条数总数到响应对象中的构造者类
     */
    public class TotalBuilder {

        /**
         * 填充一个记录条数总数到响应对象中。
         *
         * @param count 记录条数总数。
         * @return 一个响应对象。
         */
        public QueryResponse total(int count) {
            getResponse().setTotal(count);
            return QueryResponseBuilder.super.build();
        }

        /**
         * 在响应构建过程最后阶段调用，从而得到一个响应对象。
         *
         * @return 一个响应对象。
         */
        public QueryResponse build() {
            return QueryResponseBuilder.super.build();
        }
    }

    /**
     * 获得一个构建响应构建对象。
     *
     * @return 一个构建响应对象的构造者对象。
     */
    public static QueryResponseBuilder builder() {
        QueryResponseBuilder builder = new QueryResponseBuilder();
        builder.setResponse(new QueryResponse<>());
        return builder;
    }
}
